<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of sayHello
 *
 * @author sonia
 */
class encolaBirthdayTask extends sfBaseTask
{
  public function configure()
  {
    $this->namespace = 'encola';
    $this->name      = 'birthday';
    
    $this->addOptions(array(
    new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'frontend'),
    new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
        ));
  }
  
  private function verificaremail($email){ 
    if (!ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$email)){ 
      return FALSE; 
    } else { 
       return TRUE; 
    } 
  } 
  
  public function execute($arguments = array(), $options = array())
  {
      $mes = date("m"); 
      $dia = date("d"); 
      //$anyo = date("Y"); 
      
      $databaseManager = new sfDatabaseManager($this->configuration);
      //Si es 28 de febrero y no es bisiesto, busco también los que cumplen el día 29
      if (($dia == 28) && ($mes == 2) && !date("L")){
          //Obtenemos los cumpleaños de hoy y los del día 29 que no tengan todas sus pólizas de baja
          $contactos = Doctrine_Query::create()
                        ->from('Contacto c1')
                        ->where('MONTH(fecha_nac) = ?',$mes) 
                        ->andWhere('DAY(fecha_nac) = 28 OR DAY(fecha_nac) = 29')
                        ->andWhere('polizastotales > polizasbajas')
                        ->execute();          
      }
      else {
          //Obtenemos los cumpleaños de hoy que no tengan todas sus pólizas de baja
          $contactos = Doctrine_Query::create()
                        ->from('Contacto c1')
                        ->where('MONTH(fecha_nac) = ?',$mes) 
                        ->andWhere('DAY(fecha_nac) = ?',$dia)
                        ->andWhere('polizastotales > polizasbajas')
                        ->execute();
      }                
      
      $from = sfConfig::get('app_email_remiteMail');
      $nombre = sfConfig::get('app_email_remiteNombre');
      
      //Obtenemos el pie y el logotipo del envío
      //$imagen = sfConfig::get('app_email_logotipo');
      //$cabecera = "<div><img src=\"".$imagen."\" alt=\"Logotipo\" /></div>";     
      $nombre_fichero = sfConfig::get('app_email_fichfirma2');
      $fichero_texto = fopen ($nombre_fichero, "r");
      //obtenemos de una sola vez todo el contenido del fichero
      //OJO! Debido a filesize(), sólo funcionará con archivos de texto
      $pie = fread($fichero_texto, filesize($nombre_fichero));
      $novalidos = NULL;
     foreach ($contactos as $contacto){
         //Incluyo solo el email y no el nombre en un array asociativo, puesto que este puede repetirse.
          //Si el usuario tiene email y autoriza el envío de mailing
         $email = trim($contacto->getEmail());
         if ((($email != NULL)||($email != "")) && 
                 (($contacto->getAutoriza()) || ($contacto->getAutoriza() == NULL))){
             if ($this->verificaremail($email)){
                $to = $contacto->getEmail();            
                $toNombre = $contacto->getNombre()." ".$contacto->getPrimerApellido();

                /* Establezco la vble idioma en función del idioma del cliente,
                * lo hago así para evitar errores por escribirlo de distinta manera (Mayúsculas, tildes, etc).
                */
                $idioma = strtoupper($contacto->getIdioma());                   
                if ($idioma == "INGLéS"){
                    $idioma = "inglés";
                    $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_EN');
                }
                else if ($idioma == "SUECO") {
                    $idioma = "sueco";
                    $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_SW');
                }
                else{ //Si no hay idioma, considero el español por defecto
                    $idioma = "español";
                    $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_ES');
                }
                //Cojo el campo texto de la configuracion, según el idioma del cliente
                $q = Doctrine_Query::create()
                            ->select('texto, asunto')
                            ->from('Cumpleanyos c1')     
                            ->where('c1.idioma = ?',$idioma);
                $datos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

                $fichero_lopd = fopen ($nombre_fichero_lopd, "r");      
                //obtenemos de una sola vez todo el contenido del fichero
                //OJO! Debido a filesize(), sólo funcionará con archivos de texto                
                $lopd = fread($fichero_lopd, filesize($nombre_fichero_lopd));            

                //Añadimos el pie y el logotipo al envío
                //$text = $cabecera.$datos['texto'].$pie.$lopd;             
                $text = $datos['texto'].$pie.$lopd;             
                $asunto = $datos['asunto'];

                // Reemplazamos los comodines en el texto
                $text = str_replace("%nombre%", $contacto->getNombre(), $text);
                $text = str_replace("%primer_apellido%", $contacto->getPrimerApellido(), $text);
                $text = str_replace("%segundo_apellido%", $contacto->getSegundoApellido(), $text);
                $text = str_replace("%sexo%", $contacto->getSexo(), $text);
                $text = str_replace("%dni%", $contacto->getNumDocumento(), $text);
                $text = str_replace("%fecha_nacimiento%", $contacto->getFechaNac(), $text);
                $text = str_replace("%idioma%", $contacto->getIdioma(), $text);                    

                //Creo el mailer con los datos
                $message = $this->getMailer()->compose();
                $message->setSubject($asunto);            
                $message->setTo(array ($to => $toNombre));
                $message->setFrom(array ($from => $nombre));
                $message->setBody($text, 'text/html');  

                /*
                *  Supongo que los correos de cumpleaños no llevan adjuntos
                */
                        // Añado los adjuntos si existen.
                /*       if ($mailing->getAdjunto1()!= NULL){
                            $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments2').$mailing->getAdjunto1())
                                    ->setFileName($mailing->getAdjuntoOriginal1())); //cambiamos el nombre del adjunto. VER CUAL PONER, ANALISIS!!!
                        }
                        if ($mailing->getAdjunto2()!= NULL){
                            $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments2').$mailing->getAdjunto2())
                                ->setFileName($mailing->getAdjuntoOriginal2()));
                        }
                */       
                        //Lo encolamos.            
                $this->getMailer()->send($message);               
              }
              else { //Lo encolo en una lista de emails no válidos
                  $novalidos = $novalidos . " " . $email;
              }
            }
            
           
            //No lo guardamos en ningún lado, no contamos con ninguna tabla que nos indique si se envía o no.
            //$mailing->is_validated= TRUE;            
            //$mailing->save(); 
      } 
      // Creo un email para enviar los correos que no son validos si los hay.
      if ($novalidos != NULL){
                $to = sfConfig::get('app_email_remiteMail');            
                $subject = "Cumpleaños - direcciones NO Validas";
                $text = "Las direcciones siguientes no están bien formadas y, ".
                        "por tanto no se ha enviado la felicitación de cumpleaños a sus propietarios: " . $novalidos;
                //Creo el mailer con los datos
                $message = $this->getMailer()->compose();
                $message->setSubject($subject);            
                $message->setTo(array ($to => $nombre));
                $message->setFrom(array ($from => $nombre));
                $message->setBody($text);
                $this->getMailer()->send($message); 
      }
  }
}

?>
